package com.order.www;

/**
 * Creared with IntelliJ IDEA.
 * Description:一个整型数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
 * User:yxd
 * Date:2022-02-09
 * Time:12:21
 */
public class Bit2 {
    public static void main(String[] args) {
        int[] array = {1,1,2,2,3,4,4,5,6,6};
        int[] num1 = new int[1];
        int[] num2 = new int[1];
        FindNumsAppearOnce(array,num1,num2);
        System.out.println(num1[0]);
        System.out.println(num2[0]);

    }
        //num1,num2分别为长度为1的数组。传出参数
       //将num1[0],num2[0]设置为返回结果
    public static void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array == null || array.length == 0){
            return;
        }
        num1[0] = 0;
        num2[0] = 0;

        int x = array[0];
        for(int i = 1;i < array.length;i ++){
            x ^= array[i];//所有值异或后一定是剩下的两个数的异或值
        }
        if(x == 0){
            return;
        }
        //找到第一个为1的比特位，从高向底
        int size = Integer.SIZE;//int的所有比特位
        int y = 1;
        while(size-- >= 0){
            if(((y << size) & x) != 0){//此位置的比特位为1且x此位置也为1
                y <<= size;
                break;
            }
        }

        //只出现一次的两个数字异或的值位置为1的时候其两个数此位置的比特位肯定不同
        for(int i = 0;i < array.length;i ++){
            if((array[i] & y ) == 0){//此位置的值都为1
                num1[0] ^= array[i];
            }else{
                num2[0] ^= array[i];
            }

        }
    }

}
